Concat

在指定维度(axis)上连接一组张量。所有输入张量除了连接维度外,其他维度的形状必须完全相同。

\[output = \text{Concat}(input_0, input_1, \dots, input_{n-1}, \text{axis})\]
输入:
  • inputs - 包含所有输入张量起始地址的数组指针。

  • input_shapes - 包含所有输入张量形状(shape)的数组指针。

  • num_inputs - 输入张量的数量。

  • axis - 连接操作所在的维度索引。

  • input_ndim - 输入张量的维度(秩)。

  • core_mask(int, 可选) - 核掩码(仅适用于共享存储版本)。

输出:
  • output - 计算结果存储地址。

支持平台:

FT78NE MT7004

备注

  • FT78NE 支持 int8, int16, int32, fp32, fp64, cplx64, cplx128

  • MT7004 支持 fp16, fp32, int16, int32, cplx64

  • 所有输入张量的维度 input_ndim 必须一致。

  • axis 指定的维度外,所有输入张量的 shape[i] 必须相等。

共享存储版本:

void i8_concat_s(int8_t *inputs[], int *input_shapes[], int num_inputs, int axis, int input_ndim, int8_t *output, int core_mask)
void i16_concat_s(int16_t *inputs[], int *input_shapes[], int num_inputs, int axis, int input_ndim, int16_t *output, int core_mask)
void i32_concat_s(int32_t *inputs[], int *input_shapes[], int num_inputs, int axis, int input_ndim, int32_t *output, int core_mask)
void hp_concat_s(half *inputs[], int *input_shapes[], int num_inputs, int axis, int input_ndim, half *output, int core_mask)
void fp_concat_s(float *inputs[], int *input_shapes[], int num_inputs, int axis, int input_ndim, float *output, int core_mask)
void dp_concat_s(double *inputs[], int *input_shapes[], int num_inputs, int axis, int input_ndim, double *output, int core_mask)
void c64_concat_s(float *inputs[], int *input_shapes[], int num_inputs, int axis, int input_ndim, float *output, int core_mask)
void c128_concat_s(double *inputs[], int *input_shapes[], int num_inputs, int axis, int input_ndim, double *output, int core_mask)

C调用示例:

 1// FT78NE 示例(共享存储)
 2#include <stdio.h>
 3#include "78NE/utils.h"
 4
 5int main() {
 6    int shape0[] = { 4, 10, 8, 12 };
 7    int shape1[] = { 4, 5, 8, 12 };
 8    int shape2[] = { 4, 15, 8, 12 };
 9    int* input_shapes[] = { shape0, shape1, shape2 };
10
11    float *input0 = (float *)0xA0000000;
12    float *input1 = (float *)0xA2000000;
13    float *input2 = (float *)0xA4000000;
14    float *inputs[] = { input0, input1, input2 };
15    float *output = (float *)0xB0000000;
16
17    int num_inputs = 3;
18    int axis = 1;
19    int input_ndim = 4;
20    int core_mask = 0b1011;
21
22    fp_concat_s(inputs, input_shapes, num_inputs, axis, input_ndim, output, core_mask);
23    return 0;
24}

私有存储版本:

void i8_concat_p(int8_t *inputs[], int *input_shapes[], int num_inputs, int axis, int input_ndim, int8_t *output)
void i16_concat_p(int16_t *inputs[], int *input_shapes[], int num_inputs, int axis, int input_ndim, int16_t *output)
void i32_concat_p(int32_t *inputs[], int *input_shapes[], int num_inputs, int axis, int input_ndim, int32_t *output)
void hp_concat_p(half *inputs[], int *input_shapes[], int num_inputs, int axis, int input_ndim, half *output)
void fp_concat_p(float *inputs[], int *input_shapes[], int num_inputs, int axis, int input_ndim, float *output)
void dp_concat_p(double *inputs[], int *input_shapes[], int num_inputs, int axis, int input_ndim, double *output)
void c64_concat_p(float *inputs[], int *input_shapes[], int num_inputs, int axis, int input_ndim, float *output)
void c128_concat_p(double *inputs[], int *input_shapes[], int num_inputs, int axis, int input_ndim, double *output)

C调用示例:

 1// MT7004 示例(私有存储)
 2#include <stdio.h>
 3
 4int main() {
 5    int shape0[] = { 2, 3, 4, 5 };
 6    int shape1[] = { 2, 2, 4, 5 };
 7    int* input_shapes[] = { shape0, shape1 };
 8
 9    float *input0 = (float *)0x10810000;
10    float *input1 = (float *)0x10820000;
11    float *inputs[] = { input0, input1 };
12    float *output = (float *)0x10830000;
13
14    int num_inputs = 2;
15    int axis = 1;
16    int input_ndim = 4;
17
18    fp_concat_p(inputs, input_shapes, num_inputs, axis, input_ndim, output);
19    return 0;
20}